@风铃
2年前 提问
1个回答

服务器请求伪造漏洞的预防措施有哪些

安全侠
2年前

服务器请求伪造漏洞的预防措施如下:

  • 验证 HTTP Referer:在 HTTP 协议的请求头部含有一个字段叫 Referer,它记录了本次请求的来源地址。只需校验Referer是否以本域作为来源,则可以判断这个请求的真伪。这种方式的优点在于简单易用,开发人员只需用在敏感操作前增加一个拦截器检查Referer的值即可。对于已有的系统,不需要改动内部的逻 辑,比较方便。但这种方法并不是百分百有效。每个浏览器对HTTP协议的实现有一些差别,目前已经发现,IE6的浏览器Referer的值是可以被篡改。 对于新版浏览器,虽然无法纂改Referer值,但部分用户基于隐式权的需要,可以设置浏览器发送的请求不包含Referer信息。这些用户在访问时会被 误认为伪造的请求,从而拒绝了合法用户的访问。

  • 加密cookie信息:在敏感操作的提交内容中,添加一个对cookie进行Hash后的值,服务器端对Hash值进行校验,若通过则是合法的用户请求。 因为在直接的跨站请求伪造攻击中,黑客其实是无法获取cookie的具体内容,因此也无法构造一个Hash后的cookie值,从而基本杜绝了跨站请求攻 击的实施。但是这种方法还有一种可能的泄露情况。如果黑客先通过XSS攻击盗取了用户的cookie,然后再利用盗取的cookie生成Hash值而制作 伪造请求。这种情况的攻击实现比较繁琐复杂,涉及到XSS和CSRF两种攻击的结合使用。

  • 使用令牌:添加一个隐藏表单域记录随机的令牌,在求的参数中包含该令牌。服务器端执行操作前验证这个令牌,如果请求中没有令牌或者内容不正确,则认为可能 是伪造请求攻击而拒绝该请求。这种方法也可以完全解决请求伪造的问题。但在一个网站中,需要防范的地方非常多,要求每一个请求都加上令牌会增加了开发人员 的工作量,而且还很容易遗漏。

  • 在 HTTP 头中自定义属性:为了解决上一个方法设置Token比较麻烦的问题,可以将令牌放到 HTTP 头中自定义的属性里。利用XMLHttpRequest这个对象,一次性为所有敏感操作在请求头增加一个新的属性,该属性的值则是一个令牌。这种添加令牌 的方式比上一种方法简单。而且,通过 XMLHttpRequest请求的地址不会被记录到浏览器的访问历史,不用担心令牌会透过Referer被窃取。这种其实是使用Ajax方法在页面局部 的异步刷新的操作,令牌在前进,后退,收藏等行为中将失效,而且如果是遗留系统,添加Ajax请求的方法等同重新设计整个系统,代价过高。

  • 添加验证过程:如让用户去进行确认,注意确认流程应由页面接收后在前台进行显示。

  • 添加验证码:利用验证码来确认是否为当前用户发起的请求。